package com.ktgj.hotel.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.Objects;

/**
 * @Author: likeli
 * @Description: 时间类型操作
 * @Data: Create in 2018/5/14 下午3:17
 * @Modificd_By:
 */
public class DateUtils {

    /**
     * 时间类型转字符串
     *
     * @param sourceDate 源时间类型
     * @return 字符串类型
     */
    public static String toStr(Date sourceDate) {
        return DateUtils.toStr(sourceDate, "yyyy-MM-dd HH:mm:ss");
    }


    /**
     * 时间类型转字符串
     *
     * @param sourceDate 源时间类型
     * @param format     格式化 （默认：yyyy-MM-dd HH:mm:ss）
     * @return 字符串类型
     */
    public static String toStr(Date sourceDate, String format) {
        return new SimpleDateFormat(format).format(sourceDate);
    }

    /**
     * 字符串类型转时间类型
     *
     * @param sourceStr 源字符串类型
     * @return 时间类型
     */
    public static Date toDate(String sourceStr) {
        return DateUtils.toDate(sourceStr, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 字符串类型转时间类型
     *
     * @param sourceStr 源字符串类型
     * @param format    格式化 （默认：yyyy-MM-dd HH:mm:ss）
     * @return 时间类型
     */
    public static Date toDate(String sourceStr, String format) {
        try {
            return new SimpleDateFormat(format).parse(sourceStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 日期增加秒
     *
     * @param sourceDate 源时间
     * @param num        数量
     * @return 时间类型
     */
    public static Date addSecond(Date sourceDate, Integer num) {
        Calendar cl = Calendar.getInstance();
        cl.setTime(sourceDate);
        cl.add(Calendar.SECOND, num);
        return cl.getTime();
    }

    public static Date getCurrentHourTime() {
        return getHourTime(new Date(), 0, "=");
    }

    public static Date getHourTime(Date date, int n, String direction) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        ca.set(Calendar.MINUTE, 0);
        ca.set(Calendar.SECOND, 0);
        switch (direction) {
            case "+":
                ca.set(Calendar.HOUR_OF_DAY, ca.get(Calendar.HOUR_OF_DAY) + n);
                break;
            case "-":
                ca.set(Calendar.HOUR_OF_DAY, ca.get(Calendar.HOUR_OF_DAY) - n);
                break;
            case "=":
                ca.set(Calendar.HOUR_OF_DAY, ca.get(Calendar.HOUR_OF_DAY));
                break;
            default:
                ca.set(Calendar.HOUR_OF_DAY, ca.get(Calendar.HOUR_OF_DAY));
        }
        date = ca.getTime();
        return date;
    }

    /**
     * 日期增加分钟
     *
     * @param sourceDate 源时间
     * @param num        数量
     * @return 时间类型
     */
    public static Date addMinute(Date sourceDate, Integer num) {
        Calendar cl = Calendar.getInstance();
        cl.setTime(sourceDate);
        cl.add(Calendar.MINUTE, num);
        return cl.getTime();
    }

    /**
     * 日期增加小时
     *
     * @param sourceDate 源时间
     * @param num        数量
     * @return 时间类型
     */
    public static Date addHour(Date sourceDate, Integer num) {
        Calendar cl = Calendar.getInstance();
        cl.setTime(sourceDate);
        cl.add(Calendar.HOUR, num);
        return cl.getTime();
    }

    /**
     * 日期增加天数
     *
     * @param sourceDate 源时间
     * @param num        数量
     * @return 时间类型
     */
    public static Date addDay(Date sourceDate, Integer num) {
        Calendar cl = Calendar.getInstance();
        cl.setTime(sourceDate);
        cl.add(Calendar.DATE, num);
        return cl.getTime();
    }

    /**
     * 日期增加月
     *
     * @param sourceDate 源时间
     * @param num        数量
     * @return 时间类型
     */
    public static Date addMonth(Date sourceDate, Integer num) {
        Calendar cl = Calendar.getInstance();
        cl.setTime(sourceDate);
        cl.add(Calendar.MONTH, num);
        return cl.getTime();
    }

    /**
     * 日期增加年
     *
     * @param sourceDate 源时间
     * @param num        数量
     * @return 时间类型
     */
    public static Date addYear(Date sourceDate, Integer num) {
        Calendar cl = Calendar.getInstance();
        cl.setTime(sourceDate);
        cl.add(Calendar.YEAR, num);
        return cl.getTime();
    }


    /**
     * 获取当前时间戳（13位）
     *
     * @return unix时间戳
     */
    public static Long nowUnixTime() {
        return System.currentTimeMillis();
    }

    /**
     * 获取当前时间戳（10位）
     *
     * @return
     */
    public static Long nowShortUnixTime() {
        return Long.valueOf(String.format("%010d", nowUnixTime() / 1000));
    }

    /**
     * 指定时间转Unix时间戳
     *
     * @param sourceDate 源时间
     * @return unix时间戳
     */
    public static Long toUnixTime(Date sourceDate) {
        return sourceDate.getTime();
    }

    /**
     * 指定时间转Unix时间戳（10位）
     *
     * @param sourceDate 源时间
     * @return unix时间戳
     */
    public static Long toShortUnixTime(Date sourceDate) {
        return sourceDate.getTime() / 1000;
    }

    public static String unixShortToStringDate(Long unixTime, String format) {
        return new SimpleDateFormat(format, Locale.CHINA).format(new Date(unixTime * 1000));
    }

    /**
     * 指定时间转Unix时间戳
     *
     * @param sourceDate 源时间
     * @return unix时间戳
     */
    public static Long toUnixTime(String sourceDate) {
        return toUnixTime(Objects.requireNonNull(toDate(sourceDate, "yyyy-MM-dd")));
    }

    /**
     * 指定时间转Unix时间戳
     *
     * @param sourceDate 源时间
     * @return unix时间戳
     */
    public static Long toUnixTime(String sourceDate, String format) {
        return toUnixTime(Objects.requireNonNull(toDate(sourceDate, format)));
    }

    /**
     * 指定时间转Unix时间戳
     *
     * @param sourceDate 源时间
     * @return unix时间戳
     */
    public static Long toShortUnixTime(String sourceDate, String format) {
        return toUnixTime(Objects.requireNonNull(toDate(sourceDate, format))) / 1000;
    }

    /**
     * Unix时间戳转日期
     *
     * @param unixTime 源时间戳
     * @return 日期
     */
    public static Date unixToDate(Long unixTime) {
        return new Date(unixTime);
    }

    /**
     * Unix时间戳转日期字符串
     *
     * @param unixTime 源时间戳
     * @param format   格式化 （eg：yyyy-MM-dd HH:mm:ss）
     * @return 日期
     */
    public static String unixToStringDate(Long unixTime, String format) {
        return new SimpleDateFormat(format, Locale.CHINA).format(new Date(unixTime));
    }

    /**
     * 获取两个日期的时间差
     *
     * @param endDate
     * @param nowDate
     * @return
     */
    public static String getDatePoor(Date endDate, Date nowDate) {
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        long ns = 1000;
        // 获得两个时间的毫秒时间差异
        long diff = endDate.getTime() - nowDate.getTime();
        // 计算差多少天
        long day = diff / nd;
        // 计算差多少小时
        long hour = diff % nd / nh;
        // 计算差多少分钟
        long min = diff % nd % nh / nm;
        // 计算差多少秒//输出结果
        long sec = diff % nd % nh % nm / ns;
        return day + "天" + hour + "小时" + min + "分钟" + sec + "秒" + diff + "毫秒";
    }

    /**
     * 判断日期是否在指定日期范围内
     *
     * @param currDate  指定日期
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return
     */
    public static boolean isInDate(Date currDate, Date startDate, Date endDate) {
        if (startDate != null && endDate != null && currDate != null) {
            return currDate.after(startDate) && currDate.before(endDate);
        } else {
            return false;
        }
    }
}
